<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/preempt.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/preempt.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X19BU01fUFJFRU1QVF9IXzA_"><span class="b">__ASM_PREEMPT_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19BU01fUFJFRU1QVF9IXzA_"><span class="b">__ASM_PREEMPT_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">rmwcc</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">percpu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">thread_info</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="True">       7:</span> 
<a name="8" /><span class="True">       8:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVXzA_"><span class="b">DECLARE_PER_CPU</span></a><span class="f">(</span><span class="m">int</span><span class="f">,</span> <span class="b">__preempt_count</span><span class="f">)</span><span class="f">;</span>
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="k">/*</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> * We use the PREEMPT_NEED_RESCHED bit as an inverted NEED_RESCHED such</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * that a decrement hitting 0 means we can and should reschedule.</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> */</span>
<a name="14" /><span class="True">      14:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UFJFRU1QVF9FTkFCTEVEXzA_"><span class="b">PREEMPT_ENABLED</span></a>    <span class="f">(</span><span class="c">0</span> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">)</span>
<a name="15" /><span class="True">      15:</span> 
<a name="16" /><span class="True">      16:</span> <span class="k">/*</span>
<a name="17" /><span class="True">      17:</span> <span class="k"> * We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> * that think a non-zero value indicates we cannot preempt.</span>
<a name="19" /><span class="True">      19:</span> <span class="k"> */</span>
<a name="20" /><span class="True">      20:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">int</span> <span class="b">preempt_count</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="21" /><span class="True">      21:</span> <span class="f">{</span>
<a name="22" /><span class="True">      22:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9yZWFkXzRfMA__"><span class="b">__this_cpu_read_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">~</span><a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">;</span>
<a name="23" /><span class="True">      23:</span> <span class="f">}</span>
<a name="24" /><span class="True">      24:</span> 
<a name="25" /><span class="True">      25:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">preempt_count_set</span><span class="f">(</span><span class="m">int</span> <span class="b">pc</span><span class="f">)</span>
<a name="26" /><span class="True">      26:</span> <span class="f">{</span>
<a name="27" /><span class="True">      27:</span>     <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV93cml0ZV80XzA_"><span class="b">__this_cpu_write_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <span class="b">pc</span><span class="f">)</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> <span class="f">}</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="k">/*</span>
<a name="31" /><span class="True">      31:</span> <span class="k"> * must be macros to avoid header recursion hell</span>
<a name="32" /><span class="True">      32:</span> <span class="k"> */</span>
<a name="33" /><span class="True">      33:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dGFza19wcmVlbXB0X2NvdW50XzA_"><span class="b">task_preempt_count</span></a><span class="f">(</span><span class="b">p</span><span class="f">)</span> \
<a name="34" /><span class="True">      34:</span>     <span class="f">(</span><a href="cpu.c_macros_ref.html#_dGFza190aHJlYWRfaW5mb18w"><span class="b">task_thread_info</span></a><span class="f">(</span><span class="b">p</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">saved_preempt_count</span> <span class="f">&amp;</span> <span class="f">~</span><a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">)</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aW5pdF90YXNrX3ByZWVtcHRfY291bnRfMA__"><span class="b">init_task_preempt_count</span></a><span class="f">(</span><span class="b">p</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span> \
<a name="37" /><span class="True">      37:</span>     <a href="cpu.c_macros_ref.html#_dGFza190aHJlYWRfaW5mb18w"><span class="b">task_thread_info</span></a><span class="f">(</span><span class="b">p</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">saved_preempt_count</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_UFJFRU1QVF9ESVNBQkxFRF8w"><span class="b">PREEMPT_DISABLED</span></a><span class="f">;</span> \
<a name="38" /><span class="True">      38:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aW5pdF9pZGxlX3ByZWVtcHRfY291bnRfMA__"><span class="b">init_idle_preempt_count</span></a><span class="f">(</span><span class="b">p</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span> \
<a name="41" /><span class="True">      41:</span>     <a href="cpu.c_macros_ref.html#_dGFza190aHJlYWRfaW5mb18w"><span class="b">task_thread_info</span></a><span class="f">(</span><span class="b">p</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">saved_preempt_count</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_UFJFRU1QVF9FTkFCTEVEXzA_"><span class="b">PREEMPT_ENABLED</span></a><span class="f">;</span> \
<a name="42" /><span class="True">      42:</span>     <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <span class="f">(</span><span class="b">cpu</span><span class="f">)</span><span class="f">)</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_UFJFRU1QVF9FTkFCTEVEXzA_"><span class="b">PREEMPT_ENABLED</span></a><span class="f">;</span> \
<a name="43" /><span class="True">      43:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="44" /><span class="True">      44:</span> 
<a name="45" /><span class="True">      45:</span> <span class="k">/*</span>
<a name="46" /><span class="True">      46:</span> <span class="k"> * We fold the NEED_RESCHED bit into the preempt count such that</span>
<a name="47" /><span class="True">      47:</span> <span class="k"> * preempt_enable() can decrement and test for needing to reschedule with a</span>
<a name="48" /><span class="True">      48:</span> <span class="k"> * single instruction.</span>
<a name="49" /><span class="True">      49:</span> <span class="k"> *</span>
<a name="50" /><span class="True">      50:</span> <span class="k"> * We invert the actual bit, so that when the decrement hits 0 we know we both</span>
<a name="51" /><span class="True">      51:</span> <span class="k"> * need to resched (the bit is cleared) and can resched (no preempt count).</span>
<a name="52" /><span class="True">      52:</span> <span class="k"> */</span>
<a name="53" /><span class="True">      53:</span> 
<a name="54" /><span class="True">      54:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">set_preempt_need_resched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="55" /><span class="True">      55:</span> <span class="f">{</span>
<a name="56" /><span class="True">      56:</span>     <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9hbmRfNF8w"><span class="b">__this_cpu_and_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <span class="f">~</span><a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">)</span><span class="f">;</span>
<a name="57" /><span class="True">      57:</span> <span class="f">}</span>
<a name="58" /><span class="True">      58:</span> 
<a name="59" /><span class="True">      59:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">clear_preempt_need_resched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="60" /><span class="True">      60:</span> <span class="f">{</span>
<a name="61" /><span class="True">      61:</span>     <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9vcl80XzA_"><span class="b">__this_cpu_or_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="True">      62:</span> <span class="f">}</span>
<a name="63" /><span class="True">      63:</span> 
<a name="64" /><span class="True">      64:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">test_preempt_need_resched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="65" /><span class="True">      65:</span> <span class="f">{</span>
<a name="66" /><span class="True">      66:</span>     <span class="m">return</span> <span class="f">!</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9yZWFkXzRfMA__"><span class="b">__this_cpu_read_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">)</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_UFJFRU1QVF9ORUVEX1JFU0NIRURfMA__"><span class="b">PREEMPT_NEED_RESCHED</span></a><span class="f">)</span><span class="f">;</span>
<a name="67" /><span class="True">      67:</span> <span class="f">}</span>
<a name="68" /><span class="True">      68:</span> 
<a name="69" /><span class="True">      69:</span> <span class="k">/*</span>
<a name="70" /><span class="True">      70:</span> <span class="k"> * The various preempt_count add/sub methods</span>
<a name="71" /><span class="True">      71:</span> <span class="k"> */</span>
<a name="72" /><span class="True">      72:</span> 
<a name="73" /><span class="True">      73:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">__preempt_count_add</span><span class="f">(</span><span class="m">int</span> <span class="b">val</span><span class="f">)</span>
<a name="74" /><span class="True">      74:</span> <span class="f">{</span>
<a name="75" /><span class="True">      75:</span>     <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9hZGRfNF8w"><span class="b">__this_cpu_add_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <span class="b">val</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="True">      76:</span> <span class="f">}</span>
<a name="77" /><span class="True">      77:</span> 
<a name="78" /><span class="True">      78:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">void</span> <span class="b">__preempt_count_sub</span><span class="f">(</span><span class="m">int</span> <span class="b">val</span><span class="f">)</span>
<a name="79" /><span class="True">      79:</span> <span class="f">{</span>
<a name="80" /><span class="True">      80:</span>     <a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9hZGRfNF8w"><span class="b">__this_cpu_add_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">,</span> <span class="f">-</span><span class="b">val</span><span class="f">)</span><span class="f">;</span>
<a name="81" /><span class="True">      81:</span> <span class="f">}</span>
<a name="82" /><span class="True">      82:</span> 
<a name="83" /><span class="True">      83:</span> <span class="k">/*</span>
<a name="84" /><span class="True">      84:</span> <span class="k"> * Because we keep PREEMPT_NEED_RESCHED set when we do _not_ need to reschedule</span>
<a name="85" /><span class="True">      85:</span> <span class="k"> * a decrement which hits zero means we have no preempt_count and should</span>
<a name="86" /><span class="True">      86:</span> <span class="k"> * reschedule.</span>
<a name="87" /><span class="True">      87:</span> <span class="k"> */</span>
<a name="88" /><span class="True">      88:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">__preempt_count_dec_and_test</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="89" /><span class="True">      89:</span> <span class="f">{</span>
<a name="90" /><span class="True">      90:</span>     <a href="cpu.c_macros_ref.html#_R0VOX1VOQVJZX1JNV2NjXzA_"><span class="b">GEN_UNARY_RMWcc</span></a><span class="f">(</span><span class="e">&quot;decl&quot;</span><span class="f">,</span> <span class="b">__preempt_count</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_X19wZXJjcHVfYXJnXzA_"><span class="b">__percpu_arg</span></a><span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;e&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="True">      91:</span> <span class="f">}</span>
<a name="92" /><span class="True">      92:</span> 
<a name="93" /><span class="True">      93:</span> <span class="k">/*</span>
<a name="94" /><span class="True">      94:</span> <span class="k"> * Returns true when we need to resched and can (barring IRQ state).</span>
<a name="95" /><span class="True">      95:</span> <span class="k"> */</span>
<a name="96" /><span class="True">      96:</span> <span class="m">static</span> <a href="cpu.c_macros_ref.html#_X19hbHdheXNfaW5saW5lXzA_"><span class="b">__always_inline</span></a> <span class="m">bool</span> <span class="b">should_resched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="97" /><span class="True">      97:</span> <span class="f">{</span>
<a name="98" /><span class="True">      98:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="f">!</span><a href="cpu.c_macros_ref.html#_X190aGlzX2NwdV9yZWFkXzRfMA__"><span class="b">__this_cpu_read_4</span></a><span class="f">(</span><span class="b">__preempt_count</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="99" /><span class="True">      99:</span> <span class="f">}</span>
<a name="100" /><span class="True">     100:</span> 
<a name="101" /><span class="False">     101:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_PREEMPT</span>
<a name="102" /><span class="False">     102:</span>   <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_YXNtbGlua2FnZV8w"><span class="b">asmlinkage</span></a> <span class="m">void</span> <span class="b">___preempt_schedule</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="103" /><span class="False">     103:</span> <span class="f">#</span> <span class="n">define</span> <span class="b">__preempt_schedule</span><span class="f">(</span><span class="f">)</span> <span class="m">asm</span> <span class="f">(</span><span class="e">&quot;call ___preempt_schedule&quot;</span><span class="f">)</span>
<a name="104" /><span class="False">     104:</span>   <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_YXNtbGlua2FnZV8w"><span class="b">asmlinkage</span></a> <span class="m">void</span> <span class="b">preempt_schedule</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="105" /><span class="False">     105:</span> <span class="f">#</span> <span class="n">ifdef</span> <span class="b">CONFIG_CONTEXT_TRACKING</span>
<a name="106" /><span class="False">     106:</span>     <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_YXNtbGlua2FnZV8w"><span class="b">asmlinkage</span></a> <span class="m">void</span> <span class="b">___preempt_schedule_context</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="107" /><span class="False">     107:</span> <span class="f">#</span>   <span class="n">define</span> <span class="b">__preempt_schedule_context</span><span class="f">(</span><span class="f">)</span> <span class="m">asm</span> <span class="f">(</span><span class="e">&quot;call ___preempt_schedule_context&quot;</span><span class="f">)</span>
<a name="108" /><span class="False">     108:</span> <span class="f">#</span> <span class="n">endif</span>
<a name="109" /><span class="True">     109:</span> <span class="f">#</span><span class="n">endif</span>
<a name="110" /><span class="True">     110:</span> 
<a name="111" /><span class="True">     111:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __ASM_PREEMPT_H */</span>
<a name="112" /><span class="True">     112:</span> </pre>
  </body>
</html>
